//  运动
function animate( ele , attr_list , callback){
    attr_list.length = 0;
    for(var attr in attr_list){
          // 判定 attr 是不是opacity
          if( attr === "opacity"){
                attr_list[attr] = {
                      target : attr_list[attr] * 100,
                      start  : parseInt(getComputedStyle(ele)[attr] * 100)
                }
          }else{
                attr_list[attr] = {
                      target : attr_list[attr],
                      start  : parseInt(getComputedStyle(ele)[attr])
                }
          }
        
          attr_list.length ++;
    }
    clearInterval(ele.t);
    ele.t = setInterval( function(){
          for(var attr in attr_list){
                var speed = (attr_list[attr].target - attr_list[attr].start ) / 10;
                speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);

                // 让当前值开始计算; 
                attr_list[attr].start += speed;

                // 先赋值 ; 
                // 区分 attr 是不是 opacity ; 
                if( attr === "opacity"){
                      ele.style[attr] = attr_list[attr].start / 100;
                }else{
                      ele.style[attr] = attr_list[attr].start + "px";
                }
                if( attr_list[attr].target === attr_list[attr].start ){
                      delete attr_list[attr];
                      attr_list.length --;
                      
                      var count = 0;
                      
                      if(attr_list.length === 0){
                            clearInterval(t);
                            typeof callback === "function" ? callback() : "";
                      }
                }
          }
    } , 40)
}

// ajax

function setCookie( key , value , options ){
      // 为了防止options为空，我们需要给options设置默认值; 
      options = options || {};
      // options => { expires , path , domain };
      // 多个可以选参数在同一个函数之中存在，应该把可以选参数放在对象里; 
      // 因为参数是有序的; 对象是无序的; 
      if(options.expires){
            var d = new Date();
            d.setDate(d.getDate() + options.expires);
      }
      // 拼接字符串; 
      var cookie_string = [
            key + "=" + value,
            options.path ? ";path=" + options.path : "",
            options.expires ? ";expires="+d : "",
            options.domain ? ";domain=" + options.domain : ""
      ].join("");

      // console.log(cookie_string);
      document.cookie = cookie_string;
}
function removeCookie(key , options ){
      // console.log({ ...options, expires : -1 });
      setCookie(key,null,{ ...options, expires : -1 });
}     
function getCookie( key ){
      var cookie_array = document.cookie.split("; ");
      for(var i = 0 ; i < cookie_array.length ; i ++){
            var cookie_item_array = cookie_array[i].split("=");
            // 和目标值去比对; 
            if(key === cookie_item_array[0]){
                 return (cookie_item_array[1]);
            }
      }
      return "";
}
function jsonp( url , callback_felid , callback ){
      var script = document.createElement("script");
      script.src = url;
      // 自定义一个函数名; 
      // 全局的函数名 => 完全不可能和别人的名字重合; 
      // 时间戳; 以时间戳命名函数; 
      // 随机数; => 更优的方案，可以后续优化; 
      var fn_name = "_" + Date.now();
      // 因为我们的路径拼接分成两种情况; 
      // 一种是有 ? 一种是没有 ? 
      // 有 ? 我就用 & 拼接; 
      // 没有 ? 我就用 ? 拼接; 
      url += (/\?/.test(url) ? "&" : "?") +callback_felid + "=" + fn_name;

      script.src = url;
      document.body.appendChild(script);

      script.onload = function(){
            document.body.removeChild( script );
      }
      // 建立全局函数 : 
      // 让我们随机名称的函数去调用传入的回调函数;
      window[fn_name] = function(res){
            callback(res);
      }
}     

function ajax( url , options ){
      return new Promise( function( resolve ){
            options = Object.assign( {
                  type : "GET"
            } , options);
            var xhr = new XMLHttpRequest();
            xhr.open( options.type , url );
            // 判定请求发送形式是不是POST; 
            if( options.type.toUpperCase() === "POST")
                  xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
            xhr.send( options.data ? options.data : null);
            // 创建一个promise对象，把状态机包裹进去; 
            xhr.onreadystatechange = function(){
                  if( xhr.readyState === 4 && /^2\d{2}$/.test(xhr.status)){
                        typeof options.callback === "function" ? options.callback(xhr.responseText) : "";
                        resolve( xhr.responseText );
                  }
            }    
       });
}